//1、typeof
// console.log(typeof 2);//number
// console.log(typeof true);//boolean
// console.log(typeof 'str');//string
// console.log(typeof []);//object
// console.log(typeof function(){});//function
// console.log(typeof {});//object
// console.log(typeof undefined);//undefined
// console.log(typeof null);//object
//数组、对象、null都被判断为了object其他判断都是正确的




// 2、instanceof可以正确判断对象的类型，内部运行机制是判断在其原型链中能否找到该类型的原型
// console.log(2 instanceof Number);   //false
// console.log(true instanceof Boolean);  //false
// console.log('str' instanceof String);//false
// console.log([] instanceof Array);//true
// console.log(function(){} instanceof Function);//true
// console.log({} instanceof Object);//true
//instanceof只能正确判断引用数据类型，而不能判断基本数据类型，instanceof运算符可以来测试一个
//对象在其原型链中是否存在一个构造函数的prototype属性。


//3、constructor
console.log((2).constructor === Number);//true
console.log((true).constructor === Boolean);//true
console.log(('str').constructor === String);//true
console.log(([]).constructor === Array);//true
console.log((function(){}).constructor === Function);//true
console.log(({}).constructor === Object);//true
//constructor有两个作用，一是判断数据的类型，二是对象实例通过constructor对象访问它的构造函数
//需要注意，▲▲▲▲▲/** 如果创建一个对象来改变它的原型，constructor就不能用来判断数据类型了 **/

function Fn(){};
Fn.prototype = new Array();
var f = new Fn();
console.log(f.constructor === Fn);
console.log(f.constructor === Array);